/*************************************************************************
	> File Name: Example5_12.java
	> Author: Potter
	> Mail: tobewhatwewant@gmail.com 
	> Created Time: 2014年07月08日 星期二 08时58分40秒
 ************************************************************************/

/*
 * 抽象类:
 *  C++ 包含纯虚函数, 只能用作继承，不能声明函数或变量, 可以声明对象指针和引用(因为C++声明对象时就定义了对象)
 *  Java abstract 可以只有非abstract方法,不能用new创建对象, 可以作为上转型对象
 *      java中的abstract类只允许声明，不允许实现，即没有函数体,必须是实例方法;不允许final static 修饰.
 *
 *  运用时: C++: 子类必须定义纯虚函数，否则该子类仍为抽象类
 *          JAVA: 子类必须重写(override)父类的abstract方法
 * */

abstract class A {
    abstract int add (int x, int y); // 抽象方法
    int sub(int x, int y) { // 非abstract方法
        return x - y;
    }
}

class B extends A {
    int add (int x, int y) { // 子类必须重写父类的add方法
        return x + y;
    }
}

public class Example5_12 {
    public static void main(String args[]) {
        B b = new B();
        int sum = b.add(30, 20); // 调用子类重写的add方法
        int sub = b.sub(30, 20); // 调用子类继承的sub方法
        System.out.println("sum = " + sum); // 
        System.out.println("sub = " + sub);

        A a; // 抽象类声明对象
        // a是b的上转型对象
        a = b;
        sum = a.add(31, 20); // 调用子类重写的方法
        sub = a.sub(31, 20); // 调用子类集成的方法
        System.out.println("sum = " + sum); // 
        System.out.println("sub = " + sub);
    }
}
